#include <vector>
#include <string>
#include <sstream>
#include <cctype>  // for isalpha and isdigit

using namespace std;

/*
1859. 将句子排序
已解答
简单
相关标签
相关企业
提示
一个 句子 指的是一个序列的单词用单个空格连接起来，且开头和结尾没有任何空格。每个单词都只包含小写或大写英文字母。

我们可以给一个句子添加 从 1 开始的单词位置索引 ，并且将句子中所有单词 打乱顺序 。

比方说，句子 "This is a sentence" 可以被打乱顺序得到 "sentence4 a3 is2 This1" 或者 "is2 sentence4 This1 a3" 。
给你一个 打乱顺序 的句子 s ，它包含的单词不超过 9 个，请你重新构造并得到原本顺序的句子。

 

示例 1：

输入：s = "is2 sentence4 This1 a3"
输出："This is a sentence"
解释：将 s 中的单词按照初始位置排序，得到 "This1 is2 a3 sentence4" ，然后删除数字。
示例 2：

输入：s = "Myself2 Me1 I4 and3"
输出："Me Myself and I"
解释：将 s 中的单词按照初始位置排序，得到 "Me1 Myself2 and3 I4" ，然后删除数字。
 

提示：

2 <= s.length <= 200
s 只包含小写和大写英文字母、空格以及从 1 到 9 的数字。
s 中单词数目为 1 到 9 个。
s 中的单词由单个空格分隔。
s 不包含任何前导或者后缀空格。
*/


// 法一
class Solution1 {
public:
    // check函数用于将输入的句子按照单词进行分割
    vector<string> check(string s) {
        vector<string> result;  // 用于存储分割后的单词
        int n = s.size();  // 获取字符串的长度
        int i = 0;  // 定义一个索引变量来遍历字符串
        while (i < n) {
            int start = i;  // 记录单词的起始位置
            // 继续向前遍历，直到遇到非字母或数字字符（空格等）
            while (i < n && (isalpha(s[i]) || isdigit(s[i])))
                ++i;  // 如果是字母或数字，就继续遍历下一个字符
            result.emplace_back(s.substr(start, i - start));  // 获取从start到i的子串作为一个单词，并添加到结果中
            // 此时的i指向第一个空格字符，跳过空格以便开始下一个单词
            ++i;
        }
        return result;  // 返回所有单词的数组
    }

    // sortSentence函数用于根据单词末尾的数字重新排列句子中的单词
    string sortSentence(string s) {
        vector<string> result = check(s);  // 调用check函数，将句子分割为单词
        int n = result.size();  // 获取单词的个数
        vector<string> res(n);  // 用于存储按顺序排列的单词，大小为n

        // 遍历每个分割出的单词
        for (int i = 0; i < n; i++) {
            // 获取当前单词的最后一个字符，它表示该单词的原始位置
            // 通过result[i][result[i].size() - 1] - '1' 将字符转换为对应的索引位置
            // 去掉单词中的索引部分，即substr(0, result[i].size() - 1)
            res[result[i][result[i].size() - 1] - '1'] = result[i].substr(0, result[i].size() - 1);
        }

        // 将排序后的单词拼接成一个完整的句子
        string ans = "";
        for (string s : res) {
            ans += s + " ";  // 通过空格连接每个单词
        }
        ans.pop_back();  // 去掉最后一个多余的空格
        return ans;  // 返回重构后的句子
    }
};

// 法二
class Solution2 {
public:
    string sortSentence(string s) {
        vector<string> words(9);    // 最大9个单词
        stringstream ss(s);
        string word;

        // 空格分割
        while(ss >> word) {
            int index = word.back() - '0';
            word.pop_back();
            words[index - 1] = word;
        }
        // 重新拼接
        string ans = "";
        for(int i = 0; i < 9 && !words[i].empty(); i++) {
            if(!ans.empty()) {
                ans += " ";
            }
            ans += words[i];
        }
        return ans;
    }
};
    